package com.kaifamiao.store.system.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;

@Aspect // 声明这是一个切面
@Component // 声明这是一个组件
@Slf4j
public class LogAspect {

    @Around("execution(* com.kaifamiao.store.system.service.impl.*.*(..))") // 声明这是一个环绕通知
    public Object around(ProceedingJoinPoint pjp){
        // 时间
        long start = System.currentTimeMillis();
        // 获取请求参数
        Object[] args = pjp.getArgs();

        StringBuilder params = new StringBuilder();
        for (Object arg : args) {
            if (arg instanceof Object[] arr){
                params.append(Arrays.toString(arr));
            } else {
                params.append(arg);
            }
            params.append(",");
        }

        // 获取方法名
        Signature signature = pjp.getSignature();
        String methodName = signature.getName();
        // 获取类名
        String name = pjp.getTarget().getClass().getName();

        log.info("{} 执行了 {} 方法，参数是 {}", LocalDateTime.now(), name + "." + methodName, params.toString());
        try {
            // 执行方法调用
            Object result = pjp.proceed(args);
            return result;
        } catch (Throwable e) {
            log.error("执行 {} 方法出错, 参数：{}", name + "." + methodName, params);
            throw new RuntimeException(e);
        } finally {
            long end = System.currentTimeMillis();
            log.info("{} 执行了 {} 方法，耗时 {} 毫秒", LocalDateTime.now(), name + "." + methodName, end - start);
            System.out.println("after");
        }
    }

}
